package com.cw.DesignModel23.Ceational.SingletonPattern.s6;

/**
 * 双重检查（推荐使用）
 */
public class Singleton {
    //volatile：在Java中，volatile关键字可以保证变量的内存可见性。
    //当一个变量被声明为volatile时，编译器和处理器会注意到这个变量可能会被其他线程并发地访问。
    //这样可以避免线程之间的数据竞争，并确保多线程环境下变量的值是最新的。
    private static volatile Singleton instance;

    private Singleton() {
    }

    //提供一个静态的公有方法，加入双重检查代码，解决线程安全问题, 同时解决懒加载问题
    //同时保证了效率, 推荐使用
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    /**
     * 【分析】
     *
     * Double-Check概念是多线程开发中常使用到的，如代码中所示，我们进行了两次if (singleton == null)检查，这样就可以保证线程安全了
     * 这样，实例化代码只用执行一次，后面再次访问时，判断if (singleton == null)直接return实例化对象，也避免的反复进行方法同步
     * 线程安全；延迟加载；效率较高
     * 在实际开发中，推荐使用这种单例设计模式
     * ————————————————
     * 版权声明：本文为CSDN博主「Hello Dam」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/laodanqiu/article/details/131670600
     */
}

